import theAxios from 'axios'
import router from '@/router'
// import { Notify } from 'vant'
import { getToken, removeToken } from './token' //, setToken
// import { getNewTokenApi } from '@/api'
const axios = theAxios.create({
  baseURL: 'http://toutiao.itheima.net',
  timeout: 2000 // 请求超时时间
})
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 统一携带token(本地有token且api/index.js没有携带 Authorization)
  if (getToken() && config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getToken()}`
  }

  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 对响应错误做点什么
  // 还有401才代表身份过期，才需要跳转登录
  if (error.response.status === 401) {
    // 身份过期跳转到登录页
    // 由于这不是下vue组件内不能直接使用this.$router 需要导入router
    // 提示用户
    // Notify({ type: 'warning', message: '身份过期' })
    // token过期了但是还在 需要清除本地token才能让全局前置守卫放行
    removeToken()
    // 方式一：用户token失效 强制跳转到登录页
    // router.currentRoute 相当于vue文件中的this.$route -> 当前页面路由对象
    // fullPath 路由对象里完整路由路径#后的一切
    router.replace(`/login?path=${router.currentRoute.fullPath}`)

    // 方式二：用refresh_token 换回新的token再继续使用，js代码实现 用户无感知(效果好)
  //   const res = await getNewTokenApi()
  //   console.log(res)
  //   // 1.更新token在本地
  //   setToken(res.data.data.token)
  //   // 2.更新新的token在error.config的请求头里  error.config就是上一次请求的配置对象
  //   error.config.headers.Authorization = `Bearer ${res.data.data.token}`
  //   // 3.把这次未完成的错误请求(携带上一次的请求配置对象)再发起一次
  //   return axios(error.config) // 注意：一定要加return  return回原来的逻辑页面调用的地方 还是return回去一个promise对象
  // } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'put') { // refresh_token失效
  //   // 清除本地所有的token
  //   localStorage.clear()
  //   // 跳转到登录页
  //   router.replace('/login')
  //   // 提示用户身份过期
  //   Notify({ type: 'warning', message: '身份过期请重新登录' })
  }
  // return Promise.reject(error)
})

export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
  return axios({
    url,
    method,
    params,
    data,
    headers
  })

  // return new Promise ((resolve, reject) => {
  // 判断params有值 需要自己写js把params对象里的key和value拼接到url上
  //   $ajax({
  //     url,
  //     data,
  //     headers,
  //     ttpe: method,
  //     success: (res) => {
  //       resolve(res)
  //     },
  //     error: err => {
  //       reject(err)
  //     }
  //   })
  // })
}
